﻿#ifndef TGSDK_H
#define TGSDK_H

#ifdef _WIN32
#ifdef SDK_BUILD
#define TGSDK_API extern "C" __declspec(dllexport)
#define TGSDK_CALL __stdcall
#define TGSDK_CLASS __declspec(dllexport)
#else
#define TGSDK_API extern "C" __declspec(dllimport)
#define TGSDK_CALL __stdcall
#define TGSDK_CLASS __declspec(dllimport)
#endif
#else
#define TGSDK_API extern "C"
#define TGSDK_CALL
#define TGSDK_CLASS
#endif // _MSC_VER

// SDK 返回的错误码
enum E_SDK_ERROR {
  ERR_SUCCESS = 0,        // 成功
  ERR_PARAMERR = -1,      // 传入参数错误
  ERR_TIMEOUT = -2,       // 超时
  ERR_OPEN_DEV = -3,      // 打开设备失败
  ERR_WRITEDATA = -4,     // 写数据错误
  ERR_READDATA = -5,      // 读数据错误
  ERR_FILENOTEXIST = -6,  // 文件不存在或为空
  ERR_DEVICE_FAIL = -7,   // 设备返回错误信息
  ERR_READFILE = -8,      // 读取文件错误
  ERR_CANCEL = -9,        // 取消操作
  ERR_MEMORY = -10,       // 传入空间太小，内存错误
  ERR_DECODE_ERROR = -11, // 解码帧数据失败
  ERR_HID_CLOSED = -10014 // HID 总线已关闭
};

/**
 * 监听HID总线状态
 * @param ErrorCode: 错误码
 * @param ErrMsg: 错误信息
 */
typedef void(TGSDK_CALL *TG_OnHIDListener)(int ErrorCode, char *ErrMsg);

/**
 * 监听下位机数据回调
 * @param ErrorCode: 接收数据状态，通过次查看具体错误信息。成功时为 OK
 * @param errMsg: 错误消息
 * @param tag: 文本标签名称
 * @param data: 数据
 */
typedef void(TGSDK_CALL *TG_OnFrameListener)(int ErrorCode, char *errMsg,
                                             char *tag, char *data);

/**
 * 监听下位机写文件回调
 * @param ErrorCode: 接收数据状态，通过次查看具体错误信息。成功时为 OK
 * @param errMsg: 错误消息
 * @param filePath: 文件路径
 * @param progress: 进度
 * @param totalProgress: 总进度
 * @param completed: 文件读完成
 */
typedef void(TGSDK_CALL *TG_OnReadFileListener)(int ErrorCode, char *errMsg,
                                                char *filePath, char *tag,
                                                int progress,
                                                long totalProgress,
                                                bool completed);

/**
 * 监听写文件回调
 * @param ErrorCode 写文件状态码，通过次查看具体错误信息。成功时为 OK
 * @param errMsg: 错误消息
 * @param progress 写文件进度
 * @param totalProgress 文件总大小
 * @param completed 写文件完成标识
 */
typedef void(TGSDK_CALL *TG_WriteFileListener)(int ErrorCode, char *errMsg,
                                               int progress, long totalProgress,
                                               bool completed);
/**
 *  监听写随机文件
 *  @param ErrorCode 写文件状态码，通过次查看具体错误信息。成功时为 OK
 *  @param errMsg 错误消息
 *  @param started 写随机文件开始
 *  @param completed 写随机文件完成
 */
typedef void (*TG_WriteRandomFileListener)(int ErrorCode, char *errMsg,
                                           int started, int completed);

/**
 *  监听读随机文件
 *  @param ErrorCode 写文件状态码，通过次查看具体错误信息。成功时为 OK
 *  @param errMsg 错误消息
 *  @param filePath 随机文件路径
 *  @param paused 暂停
 *  @param cancel 取消
 *  @param completed 完成
 */
typedef void (*TG_ReadRandomFileListener)(int ErrorCode, char *errMsg,
                                          char *filePath, int paused,
                                          int cancel, int completed);

/**
 * 初始化
 * @param l: 接收下位机数据回调函数
 */
TGSDK_API int TG_Init(TG_OnHIDListener l1, TG_OnFrameListener l2,
                      TG_OnReadFileListener l3);

/**
 * 打开设备
 */
TGSDK_API int TG_OpenDev(unsigned short vendor_id, unsigned product_id);

/**
 * 关闭设备
 */
TGSDK_API int TG_CloseDev();

/**
 * 反初始化
 */
TGSDK_API int TG_UInit();

/**
 * 写文本数据
 * @param data: 数据，utf-8 字节数组, utf-8编码
 * @param size: 数据长度
 * @param tag: 文本标签名称
 * @param tagSize: 文本标签名称长度
 */
TGSDK_API int TG_WriteData(const char *data, int size, const char *tag,
                           int tagSize);

/**
 * 写文本数据，异步回调
 * @param data: 数据，utf-8 字节数组, utf-8编码
 * @param size: 数据长度
 * @param tag: 文本标签名称
 * @param tagSize: 文本标签名称长度
 */
TGSDK_API void TG_WriteData2(const char *data, int size, const char *tag,
                             int tagSize, TG_WriteFileListener l);

/**
 * 写数据+回调函数
 * @param filePath：文件完整路径(包括后缀)，
 * 本地编码（根据操作系统当前所在平台传递对应的字符串路径，建议使用全英文路径)
 * @param tag: 文件标签，下位机通过次标记识别文件类型
 * @param tagSize: 文件标签长度
 * @param l: 写数据回调，不用可传NULL
 */
TGSDK_API void TG_WriteFile(const char *filePath, const char *tag, int tagSize,
                            TG_WriteFileListener l);

/**
 * 停止发送数据
 */
TGSDK_API int TG_Stop();

/**
 * 取消随机文件，此时不会写完文件，并且会删掉缓存
 */
TGSDK_API void TG_CancelRandomFile();

/**
 * 停止发送随机文件，这个时候会将文件全部写完
 */
TGSDK_API void TG_StopRandomFile();

/**
 * 暂停发送随机文件
 */
TGSDK_API void TG_PauseRandomFile();

/**
 * 恢复发送随机文件
 */
TGSDK_API void TG_ResumeRandomFile();

/**
 * 写随机文件
 * @brief TG_WriteRandomFile
 * @param filePath 文件路径
 * @param fileName  文件名称带后缀
 * @param fileExtension 文件后缀类型
 * @param l 回调函数
 */
TGSDK_API void TG_WriteRandomFile(const char *filePath, int fileExtension,
                                  TG_WriteRandomFileListener l);

#endif // TGSDK_H
